import 'dart:isolate';

/// 可配置的线程通信类，支持主线程发送任务，子线程执行并返回结果。
class ThreadMessenger<T> {
  late ReceivePort _mainReceivePort;      // 主线程接收端口
  SendPort? _isolateSendPort;             // 主线程发消息给子线程的端口
  late Isolate _isolate;

  void Function(dynamic data)? uiListen;                 // 主线程接收子线程返回的数据
  Future<dynamic> Function(T data)? task;                // 子线程要执行的耗时任务

  /// 启动子线程并可选传递数据，初始化通信。
  Future<void> start([T? data]) async {
    if (task == null) throw Exception("请先设置 task 才能启动");

    _mainReceivePort = ReceivePort();

    // 主线程监听子线程发来的消息
    _mainReceivePort.listen((message) {
      if (message is SendPort) {
        _isolateSendPort = message;

        // 如果主线程有数据需要传给子线程，则立即发送
        if (data != null) {
          _isolateSendPort?.send(data);
        }
      } else {
        uiListen?.call(message); // 回调主线程结果
      }
    });

    // 启动子线程，传递主线程的 SendPort 和任务函数
    _isolate = await Isolate.spawn<_IsolateInitMessage<T>>(
      _isolateEntry,
      _IsolateInitMessage<T>(
        mainSendPort: _mainReceivePort.sendPort,
        task: task!,
      ),
    );
  }

  /// 销毁通信和线程
  void dispose() {
    _mainReceivePort.close();
    _isolate.kill(priority: Isolate.immediate);
  }

  /// 子线程入口：处理主线程发来的数据，执行任务并返回结果
  static void _isolateEntry<T>(_IsolateInitMessage<T> init) {
    final mainSendPort = init.mainSendPort;
    final isolateReceivePort = ReceivePort();

    // 把子线程的 SendPort 发给主线程
    mainSendPort.send(isolateReceivePort.sendPort);

    // 监听主线程发来的数据并处理任务
    isolateReceivePort.listen((message) async {
      final result = await init.task(message);
      mainSendPort.send(result);
    });
  }
}

/// 子线程初始化结构体
class _IsolateInitMessage<T> {
  final SendPort mainSendPort;
  final Future<dynamic> Function(T data) task;

  _IsolateInitMessage({
    required this.mainSendPort,
    required this.task,
  });
}
